##############################################################################
#**#
#**#						Lap项目自动管理（-by 南宫子萍 @Respate）
#**#
#**# 此脚本用于自动管理工程文件，在编译的过程中会自动添加 *.h *.c 文件
#**#	文件调用顺序：./Makefilec -> getdir.shc -> auto/Makefile -> 子Makefile -> inc/makeRull.h
#**#
#**# 顶层Makefile 首先导出环境变量 设置最终编译规则 并会调用 getdir.sh脚本
#**#
#**# getdir.sh脚本 负责搜寻所有头文件路径 与.c文件路径(通过判断子文件是否含有Makefile来判断)
#**#	并将搜寻结果写入 auto文件夹中 再执行此文件中的 Makefile(此文件自动生成)
#**#
#**# auto/Makefile 为getdir.sh脚本自动生成的，为子Makefile路径 ，此Makefile会自动调用子Makefile
#**#
#**# 子Makefile：如果开启了自动添加文件规则，子Makefile会调用 inc/makeRull.h 文件 此文件为子模块编译规则
#**#	并生成 lap_bin.o 模块
#**#
#**# 最终由顶层Makefile将各个模块链接成可执行程序
#**#
#**# 作 者：南宫子萍(@Respate)
#**# 时 间：2019-8-17
#**# QQ：	2085827949
##############################################################################


##############################################################################
# 工程版本信息和编译时间
##############################################################################
VERSION = $(shell date +"%Y")
PATCHLEVEL = $(shell date +"%M")
SUBLEVEL = $(shell date +"%d")
NAME = "-By Respate"
COMPILE_TIME = $(shell date +"%Y-%m-%d %H:%M:%S")



##############################################################################
#	编译器 相关定义与环境变量导出
##############################################################################
#指定编译器
CROSS_COMPILE ?=

#//编译器
CC		= $(CROSS_COMPILE)gcc	
	
#//链接器	
LD 		= $(CROSS_COMPILE)ld

#//生成bin文件			
OBJCOPY	= $(CROSS_COMPILE)objcopy	

#//反汇编工具	
OBJDUMP	= $(CROSS_COMPILE)objdump	

#//生成库	
AR		= $(CROSS_COMPILE)ar		

INCDIR	:= $(shell pwd)
#c预编处理器 Flage ，Flage 为编译器可选的选项		-nostdlib 不使用标准库	-nostdinc 不使用标准库头文件
CPPFLAGS	:= -nostdlib -nostdinc
CPPFLAGS	=
#c编译器的Flage		-Wall 警告信息   -O2编译器优化等级(默认)  -fno-builtin 不使用标准库	 -I 指定头文件路径
CFLAGS		:= -Wall -O2 -fno-builtin 

DUBG ?= -g -Wstrict-prototypes -Wunused
DUBG :=

#导出宏定义的全局变量，给子文件夹中的Makefile使用
export CC LD OBJCOPY OBJDUMP AR CFLAGS DUBG




##############################################################################
#项目管理 文件目录 以及相关文件
##############################################################################

# 目标工程 顶层绝对路径
srctree=$(shell pwd)
export srctree 

LAP_MANAGER=$(srctree)/LapManager

GETDIR_SH=$(LAP_MANAGER)/getdir.sh

MKCONfIG_H=$(LAP_MANAGER)/mkconfig.mk

#编译规则头文件
LAP_RULL := $(LAP_MANAGER)/makeRull.mk
export LAP_RULL

#引入Makefile配置文件
include $(MKCONfIG_H)


#引入动态库配置文件
DYNAMIC_H=$(srctree)/LapLib/common/LapInc.mk
include $(DYNAMIC_H)

##############################################################################
#项目临时文件 以及目录定义
##############################################################################

#//临时文件夹 自动添加文件规则临时文件
AUTODIR = $(srctree)/.auto_dir

#要写入的临时文件
HEAD_FILE=lap_head.mk
DIR_FILE=lap_alib.mk
MKAE_FILE=Makefile
export AUTODIR MKAE_FILE DIR_FILE HEAD_FILE




##############################################################################
#静默编译 					y：不输出打印信息		n：输出打印信息
##############################################################################
ifeq ($(CONFIG_KBUILD_VERBOSE),n)
Q ?=
else
Q ?= @
endif
export Q



#//getdir.sh 不扫描的文件夹
DONT_SCAN += $(CONFIG_DONT_SCAN) $(AUTODIR) $(LAP_MANAGER) 
export DONT_SCAN


#子文件夹 目标文件
_LAP_BIN = lap_bin.o
export _LAP_BIN


##############################################################################
#	Makefile 执行启点
##############################################################################

#设置编译后的文件存放路径
ifeq ($(CONFIG_BINDIR),n)
BINDIR ?=$(srctree)
else
BINDIR ?=$(srctree)/bin_dir
$(shell if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR);fi;)
endif

#预处理与反汇编文件
ifeq ($(CONFIG_ES_DBUG),y)

ES_DIR ?= $(BINDIR)/es/
$(shell if [ ! -d $(ES_DIR) ]; then mkdir $(ES_DIR);fi;)
export ES_DIR

endif

#创建临时文件 $(AUTODIR) 文件夹中的三个文件
$(shell rm -rf $(AUTODIR))	#先删除此文件夹
$(shell if [ ! -d $(AUTODIR) ]; then mkdir $(AUTODIR);echo "$(CPPFLAGS) " > $(AUTODIR)/$(HEAD_FILE);touch  $(AUTODIR)/$(DIR_FILE);echo "All:" > $(AUTODIR)/$(MKAE_FILE);fi;)


#指定编译规则
$(BINDIR)/lap.bin:	temp_bin
	$(Q)$(CC) $(DBUG) -o $@  -Wl,--start-group $(Laps-y)  $(DYNAMICLIB-y) -Wl,--end-group
	$(Q)${OBJCOPY} -O binary $@ $(BINDIR)/bin_lap.bin

	$(Q)$(OBJDUMP) -D $@ > $(BINDIR)/dis_lap.dis

	$(Q)$(OBJDUMP) -S $@ > $(BINDIR)/lap_1.S
	$(Q)$(OBJDUMP) -j .text -Sl $@ | more > $(BINDIR)/lap_2.S
	$(Q)$(OBJDUMP) -j .text -Dl $@ | more > $(BINDIR)/lap_3.S
	$(Q)$(OBJDUMP) -j .text -Sl $@ --prefix-addresses | more > $(BINDIR)/lap_4.S
	$(Q)$(OBJDUMP) -S -d -l -j .text -j .data $@ > $(BINDIR)/lap_5.S
	
	
	$(Q)echo ""
	$(Q)echo "finally bin file： $(BINDIR)/bin_lap.bin "
	$(Q)echo "^_^ lap.o made down! $(NAME)"
	$(Q)echo $(COMPILE_TIME)
	$(Q)echo ""
	

.PHONY : temp_bin
temp_bin:	
	$(Q)$(GETDIR_SH)
	$(Q)make -C $(AUTODIR)/


#获取所有子文件文件夹中的 	
Laps-y=$(shell cat $(AUTODIR)/$(DIR_FILE))





##############################################################################
# 文件清理
##############################################################################
.PHONY : distclean
distclean:
	@echo "Top dir -> $(shell pwd)"
	$(Q)find $(shell pwd) \( -name '*.o' \
	-o -name '*.dis' \
	-o -name '*.bin' \
	-o -name '*.a' \) \
	-type f -print | xargs rm -f
	$(Q)rm -rf $(AUTODIR)
	
ifeq ($(CONFIG_BINDIR),y)
	$(Q)rm -rf $(BINDIR)
endif

.PHONY : clean
clean: distclean













